﻿/**
 * 树形下拉框。
 */
Ext.define('Happy.form.field.TreeCombobox', {
    extend: 'Happy.form.field.Combobox',
    alias: 'widget.happy-tree-combobox',

    /**
     * @cfg 是否显示根节点。
     */
    rootVisible: true,
    /**
     * @cfg 是否显示根节点。
     */
    rootText: '根节点',
    /**
     * @cfg 路径字段，用来格式话缩进。
     */
    pathField: 'NodePath',
    /**
     * @cfg 路径分隔符，用来格式话缩进。
     */
    pathSeparator: '/',
    /**
     * @cfg 是否避免循节点，影响 allowSelect内部的逻辑。
     */
    avoidCircular: false,

    /**
     * 重写 ExtJs。
     * 
     * @protected
     */
    initComponent: function () {
        var me = this;

        me.configTpl();

        me.callParent(arguments);
    },

    /**
     * 配置模板。
     * 
     * @protected
     */
    configTpl: function () {
        var me = this;

        var treeNodeRenderer = me.treeNodeRenderer;
        if (!treeNodeRenderer) {
            treeNodeRenderer = function (values) {
                var level = 0;
                if (values[me.pathField]) {
                    // TODO:JS 硬编码的 1 和 2 需要重构。
                    level = values[me.pathField].split(me.pathSeparator).length - (me.rootVisible ? 1 : 2);
                }

                return Ext.String.repeat('&nbsp;', 4 * level) + values[me.displayField];
            };
        }

        Ext.applyIf(me, {
            tpl: Ext.create('Ext.XTemplate',
                '<tpl for=".">',
                    '<div class="x-boundlist-item">{[this.renderer(values)]}</div>',
                '</tpl>', {
                    renderer: treeNodeRenderer
                }
            )
        });
    },

    /**
     * @inheritdoc
     */
    configStore: function () {
        var me = this;

        me.callParent(arguments);

        // 必须在这里调用这个方法，如果在 InitComponent 之后调用的这个方法，会导致 combobox 
        // 绑定的事件先执行，进而导致父节点为根节点的时候不会显示根节点文本。
        me.appendRootNodeInStore();
    },

    /**
     * @private
     */
    appendRootNodeInStore: function () {
        var me = this;

        if (me.rootVisible == false) {
            return;
        }

        var rootRecord = me.getStore().getProxy().getModel().create();
        rootRecord.set(me.valueField, rootRecord.serverRootId);
        rootRecord.set(me.displayField, me.rootText);

        if (me.getStore().getCount() > 0) {
            me.getStore().insert(0, rootRecord);
        }
        else {
            me.getStore().on('load', function () {
                me.getStore().insert(0, rootRecord);
            });
        }
    },

    /**
     * @inheritdoc
     */
    allowSelect: function (combo, record) {
        var me = this;

        if (!me.avoidCircular) {
            return true;
        }

        var bindedRecord = combo.up('form').getRecord();
        if (!bindedRecord) {
            return true;
        }

        return !Ext.String.startsWith(record.get(me.pathField), bindedRecord.get(me.pathField));
    }
});